#include "exti.h"
#include "SysTick.h"
#include "led.h"
#include "key.h"
#include "beep.h"

/***************************
* 函数名： EXTI_Init
* 功能：外部中断初始化函数
* 输入：无
* 输出：无
*/
void EXTI_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	__HAL_RCC_GPIOA_CLK_ENABLE();	// 开启GPIOA时钟
	__HAL_RCC_GPIOE_CLK_ENABLE();	// 开启GPIOE时钟
	
	GPIO_InitStructure.Pin = GPIO_PIN_0;						// PA0
	GPIO_InitStructure.Mode = GPIO_MODE_IT_RISING;	// 上升沿触发
	GPIO_InitStructure.Pull = GPIO_PULLDOWN;					// 下拉
	HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	GPIO_InitStructure.Pin = GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4;		// PE2,3,4
	GPIO_InitStructure.Mode = GPIO_MODE_IT_FALLING;	// 下降沿触发
	GPIO_InitStructure.Pull = GPIO_PULLUP;					// 上拉
	HAL_GPIO_Init(GPIOE, &GPIO_InitStructure);
	
	// 中断线0-PA0
	HAL_NVIC_SetPriority(EXTI0_IRQn,2,0);		// 抢占优先级为2，子优先级为0
	HAL_NVIC_EnableIRQ(EXTI0_IRQn);					// 使能中断线0
	
	// 中断线2-PE2
	HAL_NVIC_SetPriority(EXTI2_IRQn,2,1);		// 抢占优先级为2，子优先级为1
	HAL_NVIC_EnableIRQ(EXTI2_IRQn);					// 使能中断线2
	
	// 中断线3-PE3
	HAL_NVIC_SetPriority(EXTI3_IRQn,2,2);		// 抢占优先级为2，子优先级为2
	HAL_NVIC_EnableIRQ(EXTI3_IRQn);					// 使能中断线3
	
	// 中断线4-PE4
	HAL_NVIC_SetPriority(EXTI4_IRQn,2,3);		// 抢占优先级为2，子优先级为3
	HAL_NVIC_EnableIRQ(EXTI4_IRQn);					// 使能中断线4
		
}

// 中断0服务函数
void EXTI0_IRQHandler(void)
{
	HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);  // 调用中断处理公用函数
}

// 中断2服务函数
void EXTI2_IRQHandler(void)
{
	HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_2);  // 调用中断处理公用函数
}

// 中断3服务函数
void EXTI3_IRQHandler(void)
{
	HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3);  // 调用中断处理公用函数
}

// 中断4服务函数
void EXTI4_IRQHandler(void)
{
	HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_4);  // 调用中断处理公用函数
}

// 中断服务程序中需要做的事情
// HAL库中所有外部中断服务函数都会调此函数
// GPIO_Pin：中断引脚号
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	delay_ms(10); // 消抖
	switch(GPIO_Pin)
	{
		case GPIO_PIN_0:
			if(KEY_UP == 1)
			{
				LED2 = 0;
			}
			break;
		case GPIO_PIN_2:
			if(KEY2 == 0)
			{
				BEEP = 1;
			}
			break;
		case GPIO_PIN_3:
			if(KEY1 == 0)
			{
				LED2 = 1;
			}
			break;
		case GPIO_PIN_4:
			if(KEY0 == 0)
			{
				BEEP = 0;
			}
			break;
	}
}